/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Informes;

import Controladores.ControladorFeriados;
import Entidades.Asistencia;
import Entidades.Empleado;
import Entidades.EmpleadoJornada;
import Entidades.FeriadoAsueto;
import Entidades.JornadaLaboral;
import Expertos.ConvertirFechas;
import Expertos.ExpertoInforme;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

/**
 *
 * @author diego
 */
public class InformePresentismoPersonal {
    private Date fechaBD;

    public InformePresentismoPersonal() {
    }
    Controladores.ControladorFeriados cf = new ControladorFeriados();
    Expertos.ExpertoInforme ei = new ExpertoInforme();

    public void imprimir(Date fechadesde, Date fechahasta, String nombreArchivo, Empleado empleado) {
        Document documento = new Document();
        FileOutputStream ficheroPdf;
        String archivo = nombreArchivo;
        String cabecera;
        int diasasistencia = 0;
        int cantidaddias = 0;
        int cantfya = 0;
        int diaslaborables;
        int tardanzas;
        int totaltardanzas = 0;
        int difEntrada = 0;
        int difSalida = 0;
        int resultadoFecha = 0;
        int resultadoFeriado = 1;
        Date fechaSistema = new Date();
        String nombreempleado = empleado.getApellido() + " " + empleado.getNombre() + "      Legajo: " + empleado.getLegajoEmpleado() + "       Oficina: " + empleado.getIdOficina().getNombreOficina();
        List<EmpleadoJornada> lej = ei.buscarEmpleadoJornadaporIDEmpleado(empleado);
        Integer idJornadaLaboral = lej.get(0).getIdJornadaLaboral().getIdJornadaLaboral();
        List<JornadaLaboral> jl2 = ei.buscarJornadaLaboralporIDJornadaLaboral(idJornadaLaboral);
        JornadaLaboral jl = jl2.get(0);

        cabecera = "_____________________________________________________________________________" + "\n"
                + "\n"
                + "\n"
                + "                                       INFORME DE PRESENTISMO PERSONAL SIMPLE " + "\n"
                + "\n"
                + "\n"
                + "______________________________________________________________________________" + "\n"
                + "\n Periodo: " + ConvertirFechas.fechaAString(fechadesde) + "   " + ConvertirFechas.fechaAString(fechahasta)
                + "\n Jornada Laboral: " + jl.getNombreJL()
                + "\n Horario de entrada: " + ConvertirFechas.horaAString(jl.getHsEntradaJL())
                + "\n Horario de salida: " + ConvertirFechas.horaAString(jl.getHsSalidaJL())
                + "\n Tolerancia: " + jl.getTolerancia() + " minutos";
        try {
            ficheroPdf = new FileOutputStream(archivo);
            PdfWriter.getInstance(
                    documento,
                    ficheroPdf).setInitialLeading(20);
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        try {
            documento.open();
            documento.add(new Paragraph(ConvertirFechas.fechaAString(fechaSistema) + "     REGISTRO DEL ESTADO CIVIL Y CAPACIDAD DE LAS PERSONAS"));
            documento.add(new Paragraph(cabecera));
            documento.add(new Paragraph("\n"));
            Paragraph parrafo2 = new Paragraph(nombreempleado);
            parrafo2.setAlignment(1);//el 1 es para centrar
            documento.add(parrafo2);
            documento.add(new Paragraph("\n"));
            documento.add(new Paragraph("\n"));
            /////// fechadesde y fechahasta don DATE y las voy a convertir a CALENDAR
            Calendar cali = GregorianCalendar.getInstance();
            Calendar calo = GregorianCalendar.getInstance();
            Calendar cali2 = GregorianCalendar.getInstance();
            Calendar calo2 = GregorianCalendar.getInstance();
            Calendar calfya = GregorianCalendar.getInstance();
            cali.setTime(fechadesde);
            calo.setTime(fechahasta);
            cali2.setTime(fechadesde);
            calo2.setTime(fechahasta);
            List<Date> dias = ConvertirFechas.getDiasHabiles(cali2, calo2);
            cantidaddias = ConvertirFechas.getCantidadDiasHabiles(cali, calo);
            List<FeriadoAsueto> fya = cf.buscarFeriadosVigentes();
            cali.setTime(fechadesde);
            calo.setTime(fechahasta);
            for (FeriadoAsueto feriadoAsueto : fya) {
                calfya.setTime(feriadoAsueto.getFechaFA());
                while ((cali.before(calfya) || cali.equals(calfya))) {
                    if (cali.equals(calfya) && feriadoAsueto.getferiado() && calo.after(calfya)) {
                        System.out.println("Soy feriado: " + feriadoAsueto.getFechaFA());
                        cantfya++;
                    }
                    cali.add(Calendar.DATE, 1);
                }
                cali.setTime(fechadesde);
            }
            List<Asistencia> as = (List<Asistencia>) empleado.getAsistenciaLista();
            for (Date diashabiles : dias) {
                        for (Asistencia asistencia : as) {
                            resultadoFecha = diashabiles.compareTo(asistencia.getFechaEntradaAsistencia());
                            //falta lo de los feriados
                            for (FeriadoAsueto feriadoAsueto : fya) {
                                if (diashabiles.compareTo(feriadoAsueto.getFechaFA()) == 0) {
                                    resultadoFeriado = 0;
                                }
                            }
                            if (resultadoFeriado == 0) {
                                //Represento la entrada en el PDF
                                resultadoFeriado = 1;
                                // Fin de la salida
                                break;
                            }
                            if (resultadoFecha == 0) {
                                fechaBD = asistencia.getFechaEntradaAsistencia();
                                ///Diferencia en la entrada
                                Date hsEntradaJL = empleado.getEjLista().get(0).getIdJornadaLaboral().getHsEntradaJL();
                                Date hsSalidaJL = empleado.getEjLista().get(0).getIdJornadaLaboral().getHsSalidaJL();
                                if (asistencia.getHsSalida() == null) {
                                    difSalida = 0;
                                } else {
                                    difSalida = ConvertirFechas.restarHorasTardanzas(asistencia.getHsSalida(), hsSalidaJL);
                                }
                                difEntrada = ConvertirFechas.restarHorasTardanzas(asistencia.getHsEntrada(), hsEntradaJL);
                                System.out.println("Diferencia entrada: " + difEntrada + "   Diferencia salida: " + difSalida);
                                if (difSalida < 0) {
                                    resultadoFeriado = 1;
                                    break;
                                }
                                if (asistencia.getFechaSalidaAsistencia() != null && (difEntrada <= empleado.getEjLista().get(0).getIdJornadaLaboral().getTolerancia()) && (difSalida >= 0)) {
                                    ///Calculo la tardanza de entrada
                                    tardanzas = ConvertirFechas.restarHorasTardanzas(asistencia.getHsEntrada(), jl.getHsEntradaJL());
                                    if (tardanzas <= 0) {
                                        tardanzas = 0;
                                    }
                                    totaltardanzas += tardanzas;
                                    // Fin de la entrada
                                    //Represento la salida en el PDF
                                    resultadoFeriado = 1;
                                    diasasistencia++;
                                }
                                break;
                            }
                            ///Cargo filas ausentes
                            if (resultadoFecha < 0) {
                                resultadoFeriado = 1;
                                break;
                            }

                            resultadoFeriado = 1;
                        }
                    }
            diaslaborables = cantidaddias - cantfya;
            documento.add(new Paragraph("Total de dias laborables: " + diaslaborables));
            documento.add(new Paragraph("Total de dias trabajados: " + diasasistencia));
            documento.add(new Paragraph("Presentismo: " + ((diasasistencia * 100) / diaslaborables) + "%"));
            documento.add(new Paragraph("Total de faltas: " + (diaslaborables - diasasistencia)));
            documento.add(new Paragraph("______________________________________________________________________________"));
            documento.close();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }
}
